La concurrencia en el planeta rojo es el arte de gestionar múltiples operaciones independientes—como la navegación del rover, la telemetría de signos vitales y las conexiones con satélites—sin que el sistema se detenga. En Go, una tarea ejecutándose de forma independiente se conoce como un goroutine.
1. El principio de no determinismo
Lo mejor es siempre asumir que las operaciones en diferentes goroutines pueden ejecutarse en cualquier orden. Debido a que el tiempo de ejecución de Go programa tareas en los núcleos disponibles, no podemos confiar en que un rover termine su escaneo antes de que otro comience su transmisión sin una sincronización explícita.
2. Mecanismos de sincronización
Para gestionar estas tareas, Go proporciona dos herramientas principales:
- Exclusión mutua: Las goroutines pueden usar un
mutexpara excluirse mutuamente de hacer algo al mismo tiempo. - La instrucción select: Parece una sentencia switch donde cada caso contiene una recepción o envío de canal.
selectespera hasta que un caso esté listo y luego lo ejecuta.
3. El esqueleto del trabajador
Los trabajadores de larga duración típicamente utilizan un bucle infinito combinado con select para monitorear múltiples canales de comunicación simultáneamente:
for {
select {
// Esperar por canales aquí.
}
}
}